import java.util.Scanner;

/**
 *  ATM取款 ATM类：
 *      属性：卡片、总额、重试次数
 *      方法：插卡、开始界面的方法、主菜单的方法
 *
 */
public class Atm {

    Scanner scanner = new Scanner(System.in);

    /*
        引用数据类型，没有赋值的时候，默认值就是null,
        此时去调用方法或者是属性时，会报错 NullPointerException
     */
    public Card card;

    public double totalMoney;

    public int replaceTimes = 0;


    /**
     * 插卡的操作
     * @param card 形参，是调用的时候传过来的值，会把当前对象的属性重新赋值
     */
    public void insertCard(Card card){

        if(card != null){
            //此时，当前对象的card 属性值，就有值了，不是null
            this.card = card;

            start();
        }
    }

    /**
     * 入口，开始取钱/存钱
     */
    public void start(){
        System.out.println("插入银行卡显示主界面:\n1.输入密码\n" +
                "\t2.退出取卡\n");

        switch (scanner.next()){
            case "1":
                //输入密码
                checkPassword();
                break;
            case "2":
                //退出
                exit();
                break;
            default:
                System.out.println("输入有误，请重新输入");
                start();
        }
    }

    /**
     * 输入密码
     */
    public void checkPassword(){

        //重试的次数 < 3，才允许输入密码
        if(replaceTimes < 3){
            System.out.println("请输入密码：");

            String input = scanner.next();

            if(!input.equals(card.password)){
                replaceTimes++;
                System.out.println("输入密码有误，请重新输入！");
                checkPassword();
            }else{
                //输入密码正确了，进入主菜单
                mainMenu();
            }
        }else{
            //冻结银行卡
            card.state = 2;
        }
    }

    public void exit(){
        System.exit(0);
    }

    /**
     * 主菜单方法
     */
    public void mainMenu(){

        System.out.println("1.查看余额\n" +
                "\t2.取款\n" +
                "\t3.存款\n" +
                "\t4.退出取卡");

        switch (scanner.next()){
            case "1":
                //查看余额
                showBalance();
                break;
            case "2":
                //取款
                drawMoney();
                break;
            case "3":
                //存款
                saveMoney();
                break;
            case "4":
                //退卡
                exit();
                break;
            default:
                System.out.println("输入有误，请重新输入");
                mainMenu();
        }
    }

    /**
     * 查看余额
     */
    public void showBalance(){
        System.out.println("您的余额是："+card.balance);
    }

    /**
     * 取款
     *  要求输入取款金额，面值最小50，单笔取款金额不能超过2000元，如果卡里余额不够则提示余额不足
     *  如果插入银行卡不是工商卡则每笔取款交易根据金额收取3%的手续费
     */
    public void drawMoney(){
        if(totalMoney <= 0 ){
            System.out.println("ATM机没有钞票了！");
            //退出方法
            return;
        }
        System.out.println("请输入金额：");
        double money = scanner.nextDouble();

        //面值最小50
        if(money % 50 != 0){
            System.out.println("最小面值，不能小于50");
            //退出方法
            return;
        }
        if(money > 2000){
            System.out.println("单笔取款金额不能超过2000元");
            return;
        }

        double reteMoney = 0;
        if(!card.type.equals("工行")){
            //手续费
            reteMoney = money * 0.03;

        }

        if(money + reteMoney > card.balance){
            System.out.println("余额不足");
        }else if(money > totalMoney){
            System.out.println("ATM余额不足");
        }else {
            card.balance -=( money + reteMoney);
            totalMoney -= money;

            //打印凭条
            printMsg(true,money);
        }

    }

    /**
     * 要求输入存款金额，面值最小为50，如果该ATM的存款总额度达到了50W元则提示无法继续存款
     */
    public void saveMoney(){

        System.out.println("请输入存款金额：");
        double saveMoney = scanner.nextDouble();

        if(saveMoney % 50 != 0){
            System.out.println("面值最小为50，无法存款");
            return;
        }

        if(saveMoney + totalMoney >= 500000){
            System.out.println("ATM满钞了！");
            return;
        }

        card.balance += saveMoney;
        totalMoney += saveMoney;

        printMsg(false,saveMoney);
    }

    public void printMsg(boolean isDraw,double money){
        System.out.println((isDraw == true ? "取款":"存款" ) + "成功！金额为："+money);

    }
}

class AtmTest{

    public static void main(String[] args) {
        Atm atm = new Atm();

        Card card = new Card();
        card.balance = 1000;
        card.type = "工行";

        atm.totalMoney = 40000;
        atm.insertCard(card);

    }
}
